<?php
/**
 * This file is part of workerman.
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the MIT-LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @author walkor<walkor@workerman.net>
 * @copyright walkor<walkor@workerman.net>
 * @link http://www.workerman.net/
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 */

/**
 * 用于检测业务代码死循环或者长时间阻塞等问题
 * 如果发现业务卡死，可以将下面declare打开（去掉//注释），并执行php start.php reload
 * 然后观察一段时间workerman.log看是否有process_timeout异常
 */
//declare(ticks=1);

use \GatewayWorker\Lib\Gateway;
use \GatewayWorker\Lib\Db;
use \Config\Db as database;
use \Workerman\Lib\Timer;
/**
 * 主逻辑
 * 主要是处理 onConnect onMessage onClose 三个方法
 * onConnect 和 onClose 如果不需要可以不用实现并删除
 */
class Events
{
    /**
     * 当客户端连接时触发
     * 如果业务不需此回调可以删除onConnect
     * 
     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        $db1 = Db::instance('db3');
        global $num;
        $all_arrs=array();
        $all_arrs['id']=$client_id;
        $all_arrs['time']=time();
        $all_arrs=json_encode($all_arrs);
        //向当前client_id发送数据 
        Gateway::sendToClient($client_id, "$all_arrs\r\n");
        //向所有人发送
        Gateway::sendToAll("$all_arrs\r\n");

        echo "connect".++$num.":".$client_id."\n";
    }
    
   /**
    * 当客户端发来消息时触发
    * @param int $client_id 连接id
    * @param mixed $message 具体消息
    */
   public static function onMessage($client_id, $message)
   {
        $message_data=json_decode($message);
        if(!$message_data){
            return;
        }
        switch($message_data['type']) {
            // 客户端回应服务端的心跳
            case 'pong':
                Gateway::sendToClient($client_id, $message);
                return;
                break;
            case 'init':
                // uid
                $uid = $message_data['user_id'];
                if($uid){
                    // 设置session
                    $_SESSION = [
                        'nickname' => $message_data['nickname'],
                        'uid'      => $uid                
                        ];
                    $old = Gateway::getClientIdByUid($uid);
                    if(!empty($old)){
                        //通知其他客户端下线
                        $data = [
                            'type' => 'outline'
                        ];
                        foreach($old as $v){
                            Gateway::sendToClient($v, base64_encode(json_encode($data)));
                            Gateway::unbindUid($v, $uid);
                        }
                    }
                    // 将当前链接与uid绑定
                    Gateway::bindUid($client_id, $uid);
                    // 通知当前客户端初始化
                    $init_message = array(
                        'type' => 'init'
                    );
                    Gateway::sendToClient($client_id, base64_encode(json_encode($init_message)));
                }
                
                return;
                break;
        }
        // 向所有人发送 
        //Gateway::sendToAll("$client_id said $message\r\n");
   }
   
   /**
    * 当用户断开连接时触发
    * @param int $client_id 连接id
    */
   public static function onClose($client_id)
   {
       // 向所有人发送 
       GateWay::sendToAll("$client_id logout\r\n");
   }
}
